package com.rafaelGarcia.eLibreria.modelos.implementaciones;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.rafaelGarcia.eLibreria.modelos.interfaces.Autor;
import com.rafaelGarcia.eLibreria.modelos.interfaces.Ejemplar;
import com.rafaelGarcia.eLibreria.modelos.interfaces.Estilo;
import com.rafaelGarcia.eLibreria.modelos.interfaces.Libro;

@Entity
@Table(name="libros")
public class LibroImpl implements Libro {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 4554816144440439762L;
	
	@Id
	private Long ISBN;
	
	@OneToOne(targetEntity=AutorImpl.class)
	private Autor autor;
	
	@OneToMany(cascade=CascadeType.ALL, 
				targetEntity=EjemplarImpl.class,
				mappedBy="miLibro", 
				fetch=FetchType.LAZY)
	private Set<Ejemplar> ejemplares = new HashSet<Ejemplar>();
	
	@OneToMany(cascade=CascadeType.ALL, targetEntity = EstiloImpl.class)
	@JoinTable(name = "Estilos_Libro",
				joinColumns={@JoinColumn(name="Libro_ID")},
				inverseJoinColumns={@JoinColumn(name="Estilo_ID")})
	private Set<Estilo> estilos = new HashSet<Estilo>();
	
	private String titulo;
	private String descripcion;	
	private Integer numPaginas;
	
	public LibroImpl(){}
	
	public LibroImpl(Long ISBN, String t, String d, Integer numP, Autor a){
		this.ISBN = ISBN;
		titulo = t;
		descripcion = d;
		numPaginas = numP;
		autor = a;
	}

	public Long getISBN() {
		return ISBN;
	}

	public void setISBN(Long iSBN) {
		ISBN = iSBN;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public Autor getAutor() {
		return autor;
	}

	public void setAutor(Autor autor) {
		this.autor = autor;
	}

	public Integer getNumPaginas() {
		return numPaginas;
	}

	public void setNumPaginas(Integer numPaginas) {
		this.numPaginas = numPaginas;
	}

	public Set<Ejemplar> getEjemplares() {
		return ejemplares;
	}

	public void setEjemplares(Set<Ejemplar> ejemplares) {
		this.ejemplares = ejemplares;
	}

	public Set<Estilo> getEstilos() {
		return estilos;
	}

	public void setEstilos(Set<Estilo> estilos) {
		this.estilos = estilos;
	}

	public void addEstilo(Estilo e) {
		estilos.add(e);		
	}

	public void removeEstilo(Estilo e) {
		estilos.remove(e);
	}

	public void addEjemplar(Ejemplar e) {
		ejemplares.add(e);		
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((ISBN == null) ? 0 : ISBN.hashCode());
		result = prime * result + ((autor == null) ? 0 : autor.hashCode());
		result = prime * result
				+ ((descripcion == null) ? 0 : descripcion.hashCode());
		result = prime * result + ((estilos == null) ? 0 : estilos.hashCode());
		result = prime * result
				+ ((numPaginas == null) ? 0 : numPaginas.hashCode());
		result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		LibroImpl other = (LibroImpl) obj;
		if (ISBN == null) {
			if (other.ISBN != null)
				return false;
		} else if (!ISBN.equals(other.ISBN))
			return false;
		if (autor == null) {
			if (other.autor != null)
				return false;
		} else if (!autor.equals(other.autor))
			return false;
		if (descripcion == null) {
			if (other.descripcion != null)
				return false;
		} else if (!descripcion.equals(other.descripcion))
			return false;
		if (estilos == null) {
			if (other.estilos != null)
				return false;
		} else if (!estilos.equals(other.estilos))
			return false;
		if (numPaginas == null) {
			if (other.numPaginas != null)
				return false;
		} else if (!numPaginas.equals(other.numPaginas))
			return false;
		if (titulo == null) {
			if (other.titulo != null)
				return false;
		} else if (!titulo.equals(other.titulo))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Libro " + titulo + " [ISBN #: " + ISBN.toString() + "] [Paginas: " + numPaginas + "]";
	}	
}
